/**
 * @description: debounce - 防抖
 * 1、高阶函数，传入一个函数，返回一个函数。
 * 2、在 delay 时间内，前后两次点击，阻止前一次点击，延迟后一次点击，重复 n 个两次，直到最后一次点击，延迟 delay 最后一次的点击。
 * 3、回调函数需要手动绑定 this 以及传参。
 * @author: huen2015
 */

import { IFn } from './types'

function debounce(
	fn: IFn,
	delay = 300,
): EventListenerOrEventListenerObject | any {
	let timer: any = null

	return function (this: any, ...args: any[]) {
		if (timer) {
			clearTimeout(timer)
			timer = null
		}

		timer = setTimeout(() => {
			fn.apply(this, args)
		}, delay)
	}
}

const debounceDom = document.querySelector('#debounce')
if (debounceDom) {
	// Event - UIEvent - MouseEvent - PointerEvent
	debounceDom.addEventListener(
		'click',
		debounce(function (this: any, e: PointerEvent) {
			console.log('debounce - 防抖')
			console.log('this', this)
			console.log('e', e)
		}),
	)
}

export { debounce }
